#include <head.h>


sem_t sem;              // 定义信号量
pthread_mutex_t mutex;  // 定义互斥锁
// 声明线程函数
void * sem_func(void * val);

int main(int argc, char const *argv[])
{
    // 定义线程 tid 以及 id
    pthread_t Tid[6];
    pthread_t tid;
    int ID_arr[6] = {1,2,3,4,5,6}; // 线程内部使用 展示自己是几号线程
    int __errnum;
    // 初始化信号
    sem_init( &sem , 0 , 3 ); // 设置停车场 一次只能停 3 辆车 
    //初始化互斥锁
    pthread_mutex_init(&mutex , NULL);
    // 创建线程
    for (int  i = 0; i < 6; i++)
    {
    
        if (0 != (__errnum = pthread_create( &Tid[i] , NULL , sem_func , (void * )&ID_arr[i])))
        {
            printf("pthread_create error: %d %s\n" , __errnum , strerror(__errnum));
        }
        // 重置错误码 == 重置 系统中的 error 的值 perror 是可以直接获取的
        // 返回错误码 == 当函数出错时 返回错误码编号 strerror
    }
    // 管理员线程
    pthread_create( &tid , NULL , admin , NULL);
    

    // 回收线程
    for (int i = 0; i < 6; i++)
    {
        pthread_join(Tid[i] , NULL);
    }
    // 回收线程
    pthread_join(tid , NULL);
    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);
   
    // 销毁信号
    sem_destroy(&sem);

    return 0;
}


// 定义线程函数
void * sem_func(void * val)
{
    int id = *((int *)val);
    printf("小车 %d 等\n", id);
    // P操作
    sem_wait(&sem);

    // 线程开始工作
    printf("小车 %d 停\n", id);
    sleep(2);
    printf("小车 %d 走\n", id);

    // V操作
    sem_post(&sem);

    return NULL;
}

//管理员线程
void * admin(void * val)
{
    
}
